import requests
from api import log
from api.api_approve_trust import ApiApproveTrust
from api.api_register_login import ApiRegisterLogin
from tools import com_assert, html_parser


class TestApproveTrust:
    """认证与开户功能测试类

    包含三个测试用例：
    1. 实名认证接口测试
    2. 认证状态查询接口测试
    3. 开户接口测试（包含后台开户和三方开户）
    """
    def setup(self):
        """测试前置方法（每个测试方法执行前调用）"""
        # 创建会话对象（保持登录状态）
        self.session = requests.session()

        # 实例化认证接口对象
        self.api = ApiApproveTrust(self.session)

        try:
            # 执行登录操作（使用预置账号）
            # keyword参数可能是手机号或用户名
            r = ApiRegisterLogin(self.session).api_login(
                keyword="123456789710",
                password="123456"
            )
            # 记录登录结果（需要修正格式字符串）
            log.info("登录接口执行结果为：{}".format(r.text))
        except Exception as e:
            # 捕获并记录异常
            log.error(e)
            # 重新抛出异常，使测试失败
            raise

    def teardown(self):
        """测试后置方法（每个测试方法执行后调用）"""
        # 关闭会话，释放资源
        self.session.close()

    def test01_approve(self, expect_json):
        """测试实名认证接口

        参数:
            expect_json: 预期响应结果的JSON数据
        """
        try:
            # 调用认证接口
            result = self.api.api_approve()

            # 记录接口响应结果（需要修正格式字符串）
            log.info("认证接口执行结果为：{}".format(result.text))

            # 断言验证响应结果
            com_assert(result, expect_json=expect_json)
            log.info("认证接口断言成功")

            # 打印响应内容（调试用）
            print(result.text)
        except Exception as e:
            # 捕获并记录异常
            log.error(e)
            # 重新抛出异常，使测试失败
            raise

    def test02_approve_status(self, expect_json):
        """测试认证状态查询接口

        参数:
            expect_json: 预期响应结果的JSON数据
        """
        try:
            # 调用认证状态查询接口
            result = self.api.api_approve_stutas()

            # 记录接口响应结果（需要修正格式字符串）
            log.info("认证状态接口执行结果为：{}".format(result.text))

            # 断言验证响应结果
            com_assert(result, expect_json=expect_json)
            log.info("认证状态接口断言成功")

            # 打印响应内容（调试用）
            print(result.text)
        except Exception as e:
            # 捕获并记录异常
            log.error(e)
            # 重新抛出异常，使测试失败
            raise

    def test03_trust(self, expect_json="form",expect_json2="ok"):
        """测试开户接口（包含后台开户和三方开户）

        参数:
            expect_json: 预期响应结果的JSON数据
        """
        try:
            # 1. 调用后台开户接口
            result = self.api.api_trust()

            # 记录接口响应结果（使用json格式）
            log.info("后台开户接口执行结果为：{}".format(result.json()))

            # 断言验证响应结果（当前被注释）
            com_assert(result, expect_json=expect_json)
            log.info("后台开户接口断言成功")

            # 打印响应内容（调试用）
            print(result.json)

            # 2. 解析返回的HTML表单
            # 使用html_parser工具解析响应中的HTML表单
            # 返回值为元组 (url, data)
            data = html_parser(result)

            # 3. 提交表单到三方开户接口
            # 使用解析出的URL和表单数据提交
            result1 = self.session.post(url=data[0], data=data[1])

            # 记录三方开户接口响应结果
            log.info("三方开户接口执行结果为：{}".format(result1.json()))

            # 断言验证三方开户结果
            com_assert(result, expect_json=expect_json2)
        except Exception as e:
            # 捕获并记录异常
            log.error(e)
            # 重新抛出异常，使测试失败
            raise